{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# if语句\n",
    "\n",
    "* 如果 **条件满足**，才能做某件事情，\n",
    "* 如果 **条件不满足**，就做另外一件事情，或者什么也不做\n",
    "\n",
    "> 正是因为有了判断，才使得程序世界丰富多彩，充满变化！\n",
    ">\n",
    "> **判断语句** 又被称为 “分支语句”，正是因为有了判断，才让程序有了很多的分支\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 02. if 语句体验\n",
    "\n",
    "### 2.1 if 判断语句基本语法\n",
    "\n",
    "在 `Python` 中，**if 语句** 就是用来进行判断的，格式如下：\n",
    "\n",
    "```python\n",
    "if 要判断的条件:\n",
    "    条件成立时，要做的事情\n",
    "    ……\n",
    "```\n",
    "\n",
    "> 注意：代码的缩进为一个 `tab` 键，或者 **4** 个空格 —— **建议使用空格**\n",
    "> \n",
    "> * 在 Python 开发中，Tab 和空格不要混用！\n",
    "\n",
    "**我们可以把整个 if 语句看成一个完整的代码块**\n",
    "\n",
    "![004_if语句是一个完整的代码块1-w400](./res/004_if语句是一个完整的代码块1.png)\n",
    "\n",
    "### 2.2 判断语句演练 —— 判断年龄\n",
    "\n",
    "**需求**\n",
    "\n",
    "1. 定义一个整数变量记录年龄\n",
    "2. 判断是否满 18 岁 （**>=**）\n",
    "3. 如果满 18 岁，允许进网吧嗨皮\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "可以进网吧嗨皮……\n",
      "这句代码什么时候执行?\n"
     ]
    }
   ],
   "source": [
    "# 1. 定义年龄变量\n",
    "age = 18\n",
    "\n",
    "# 2. 判断是否满 18 岁\n",
    "# if 语句以及缩进部分的代码是一个完整的代码块\n",
    "if age >= 18:\n",
    "    print(\"可以进网吧嗨皮……\")\n",
    "\n",
    "# 3. 思考！- 无论条件是否满足都会执行\n",
    "print(\"这句代码什么时候执行?\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**注意**：\n",
    "\n",
    "* `if` 语句以及缩进部分是一个 **完整的代码块**\n",
    "\n",
    "### 2.3 else 处理条件不满足的情况\n",
    "\n",
    "**思考**\n",
    "\n",
    "在使用 `if` 判断时，只能做到满足条件时要做的事情。那如果需要在 **不满足条件的时候**，做某些事情，该如何做呢？\n",
    "\n",
    "**答案**\n",
    "\n",
    "`else`，格式如下：\n",
    "\n",
    "```python\n",
    "if 要判断的条件:\n",
    "    条件成立时，要做的事情\n",
    "    ……\n",
    "else:\n",
    "    条件不成立时，要做的事情\n",
    "    ……\n",
    "```\n",
    "\n",
    "**注意**：\n",
    "\n",
    "* `if` 和 `else` 语句以及各自的缩进部分共同是一个 **完整的代码块**\n",
    "\n",
    "### 2.4 判断语句演练 —— 判断年龄改进\n",
    "\n",
    "**需求**\n",
    "\n",
    "1. 输入用户年龄\n",
    "2. 判断是否满 18 岁 （**>=**）\n",
    "3. 如果满 18 岁，允许进网吧嗨皮\n",
    "4. 如果未满 18 岁，提示回家写作业\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "今年多大了？15\n",
      "你还没长大，应该回家写作业！\n",
      "这句代码什么时候执行?\n"
     ]
    }
   ],
   "source": [
    "# 1. 输入用户年龄\n",
    "age = int(input(\"今年多大了？\"))\n",
    "\n",
    "# 2. 判断是否满 18 岁\n",
    "# if 语句以及缩进部分的代码是一个完整的语法块\n",
    "if age >= 18:\n",
    "    print(\"可以进网吧嗨皮……\")\n",
    "else:\n",
    "    print(\"你还没长大，应该回家写作业！\")\n",
    "\n",
    "# 3. 思考！- 无论条件是否满足都会执行\n",
    "print(\"这句代码什么时候执行?\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 在开发中，使用 `if` 可以 **判断条件**\n",
    "* 使用 `else` 可以处理 **条件不成立** 的情况\n",
    "* 但是，如果希望 **再增加一些条件**，**条件不同，需要执行的代码也不同** 时，就可以使用 `elif` \n",
    "* 语法格式如下：\n",
    "\n",
    "```python\n",
    "if 条件1:\n",
    "    条件1满足执行的代码\n",
    "    ……\n",
    "elif 条件2:\n",
    "    条件2满足时，执行的代码\n",
    "    ……\n",
    "elif 条件3:\n",
    "    条件3满足时，执行的代码\n",
    "    ……\n",
    "else:\n",
    "    以上条件都不满足时，执行的代码\n",
    "    ……\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "买苹果\n",
      "吃大餐\n"
     ]
    }
   ],
   "source": [
    "holiday_name = \"平安夜\"\n",
    "\n",
    "if holiday_name == \"情人节\":\n",
    "    print(\"买玫瑰\")\n",
    "    print(\"看电影\")\n",
    "elif holiday_name == \"平安夜\":\n",
    "    print(\"买苹果\")\n",
    "    print(\"吃大餐\")\n",
    "elif holiday_name == \"生日\":\n",
    "    print(\"买蛋糕\")\n",
    "else:\n",
    "    print(\"每天都是节日啊……\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 在开发中，使用 `if` 进行条件判断，如果希望 **在条件成立的执行语句中** 再 **增加条件判断**，就可以使用 **if 的嵌套**\n",
    "* **if 的嵌套** 的应用场景就是：**在之前条件满足的前提下，再增加额外的判断**\n",
    "* **if 的嵌套** 的语法格式，**除了缩进之外** 和之前的没有区别\n",
    "* 语法格式如下：\n",
    "\n",
    "```python\n",
    "if 条件 1:\n",
    "    条件 1 满足执行的代码\n",
    "    ……\n",
    "    \n",
    "    if 条件 1 基础上的条件 2:\n",
    "        条件 2 满足时，执行的代码\n",
    "        ……    \n",
    "        \n",
    "    # 条件 2 不满足的处理\n",
    "    else:\n",
    "        条件 2 不满足时，执行的代码\n",
    "        \n",
    "# 条件 1 不满足的处理\n",
    "else:\n",
    "    条件1 不满足时，执行的代码\n",
    "    ……\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "有车票，可以开始安检...\n",
      "不允许携带 20 厘米长的刀上车\n"
     ]
    }
   ],
   "source": [
    "# 定义布尔型变量 has_ticket 表示是否有车票\n",
    "has_ticket = True\n",
    "\n",
    "# 定义整数型变量 knife_length 表示刀的长度，单位：厘米\n",
    "knife_length = 20\n",
    "\n",
    "# 首先检查是否有车票，如果有，才允许进行 安检\n",
    "if has_ticket:\n",
    "    print(\"有车票，可以开始安检...\")\n",
    "\n",
    "    # 安检时，需要检查刀的长度，判断是否超过 20 厘米\n",
    "    # 如果超过 20 厘米，提示刀的长度，不允许上车\n",
    "    if knife_length >= 20:\n",
    "        print(\"不允许携带 %d 厘米长的刀上车\" % knife_length)\n",
    "    # 如果不超过 20 厘米，安检通过\n",
    "    else:\n",
    "        print(\"安检通过，祝您旅途愉快……\")\n",
    "\n",
    "# 如果没有车票，不允许进门\n",
    "else:\n",
    "    print(\"大哥，您要先买票啊\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 05. 综合应用 —— 石头剪刀布\n",
    "\n",
    "**目标**\n",
    "\n",
    "1. 强化 **多个条件** 的 **逻辑运算**\n",
    "2. 体会 `import` 导入模块（“工具包”）的使用\n",
    "\n",
    "**需求**\n",
    "\n",
    "1. 从控制台输入要出的拳 —— 石头（1）／剪刀（2）／布（3）\n",
    "2. 电脑 **随机** 出拳 —— 先假定电脑只会出石头，完成整体代码功能\n",
    "3. 比较胜负\n",
    "\n",
    "| 序号 | 规则 |\n",
    "| :---: | :---: |\n",
    "| 1 | 石头 胜 剪刀 |\n",
    "| 2 | 剪刀 胜 布 |\n",
    "| 3 | 布 胜 石头 |\n",
    "\n",
    "### 5.1 基础代码实现\n",
    "\n",
    "* 先 **假定电脑就只会出石头**，完成整体代码功能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "请出拳 石头（1）／剪刀（2）／布（3）：3\n",
      "噢耶！！！电脑弱爆了！！！\n"
     ]
    }
   ],
   "source": [
    "# 从控制台输入要出的拳 —— 石头（1）／剪刀（2）／布（3）\n",
    "player = int(input(\"请出拳 石头（1）／剪刀（2）／布（3）：\"))\n",
    "\n",
    "# 电脑 随机 出拳 - 假定电脑永远出石头\n",
    "computer = 1\n",
    "\n",
    "# 比较胜负\n",
    "# 如果条件判断的内容太长，可以在最外侧的条件增加一对大括号\n",
    "# 再在每一个条件之间，使用回车，PyCharm 可以自动增加 8 个空格\n",
    "if ((player == 1 and computer == 2) or\n",
    "        (player == 2 and computer == 3) or\n",
    "        (player == 3 and computer == 1)):\n",
    "\n",
    "    print(\"噢耶！！！电脑弱爆了！！！\")\n",
    "elif player == computer:\n",
    "    print(\"心有灵犀，再来一盘！\")\n",
    "else:\n",
    "    print(\"不行，我要和你决战到天亮！\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
